Rapid improvements in digital cameras and lower costs occur today at an amazing rate. In a recent year, more digital cameras were sold than traditional film cameras. Images from digital cameras can be downloaded and stored on personal computers. Digital pictures can be converted to common formats such as JPEG and sent as e-mail attachments or posted to virtual photo albums on the Internet. Video as well as still images can be captured, depending on the kind of digital camera.
FIG. 1 is a block diagram for a typical digital camera. Light focused through a lens is directed toward sensor 12, which can be a charge-coupled device (CCD) array or a complementary metal-oxide-semiconductor (CMOS) sensor array. The light falling on the array generates electrical currents, which are amplified by analog amp 14 before being converted from analog to digital values by A/D converter 16. An 8, 9, or 10-bit mono-color pixel is output to processor 10. These mono-color pixels are in a Bayer-pattern as shown in FIG. 2. Each pixel is either a red, a blue, or a green intensity.
The R, G, or B digital values in the Bayer pattern are processed by processor 10 to generate red-green-blue (RGB) or luminance-chrominance YUV pixels. The RGB or YUV pixels can then be displayed on display 19 or compressed by compressor 18 and stored on disk 17 or on a solid-state memory. YUV pixels often have a 4:4:4 format, with 8 bits for each of 2 colors and for the luminance. RGB pixels have varying formats, such as 4, 5, 6, or 8 bits per color.
Sensor 12 detects red, blue and green colors. However, each array point in sensor 12 can detect only one of the three primary colors. Rather than outputting an RGB pixel, sensor 12 can output only a single-color pixel at any given time. For example, a line of pixels output by sensor 12 might have a red pixel followed by a green pixel. Another line might have alternating green and blue pixels.
Each pixel represents the intensity of one of the primary colors at a point in the sensor array. Thus a red pixel indicates the intensity of red light at a point, while a neighboring green pixel indicates the intensity of green light at the next point in the sensor array. Each pixel contains only one-third of the total color information.
The remaining color information is obtained by interpolation. The green intensity of a red pixel is calculated by averaging the green intensities of neighboring green pixels. The blue intensity for that red pixel is calculated by averaging or interpolating the nearest blue pixels. Processor 10 performs this color interpolation, calculating the missing primary-color intensities for each pixel location.
Processor 10 also may perform other enhancements to the image. Edges may appear fuzzy because the color interpolation tends to spread out features. These edges can be sharpened by detecting the edges and enhancing the color change at the edge to make the color transition more abrupt. Color conversion from RGB to YUV may also be performed by processor 10.
The electrical currents produced by the different primary colors can vary, depending on the sensor used and the wavelength and energy of the light photons. An adjustment known as a white-balance can be performed before processor 10, either on analog or digital values. Each primary color can be multiplied by a different gain to better balance the colors. Compensation can also be made for different lighting conditions, increasing all primary colors for dark pictures or decreasing all colors for bright pictures (overexposure).
Bayer Pattern—FIG. 2
FIG. 2 shows an image captured by a sensor that generates single-color pixels in a Bayer pattern. The example shows an 800×600 frame or image for display in the common super-VGA resolution. A total of 600 lines are captured by the sensor, with 800 pixels per line.
A personal computer displays full-color pixels that have all three primary-color intensities (RGB). In contrast, the sensor in a digital camera can detect only one of the three primary colors for each point in the 800×600 sensor array. Detectors for green are alternated with red detectors in the first line, while green detectors are alternated with blue detectors in the second line.
The first horizontal line and each odd line have alternating red and green detectors, so pixels output from these odd lines are in a R-G-R-G-R-G-R-G sequence. The second horizontal line and each even line have alternating green and blue detectors, so pixels output from these even lines are in a G-B-G-B-G-B-G-B sequence.
Half of the pixels are green pixels, while one-quarter of the pixels are read and the last quarter are blue. The green pixels form a checkerboard pattern, with blue and red pixels surrounded by green pixels. Since the human eye is more sensitive to green, the Bayer pattern has more green pixels than red or blue.
The green intensity for a red pixel location can be interpolated by averaging the four green pixels that surround the red pixel. For example, the green intensity for red pixel at location (3,3) is the sum of green pixels (3,2), (3,4), (2,3), and (4,3), divided by four. Likewise, the green intensity for a blue pixel location can be interpolated by averaging the four surrounding green pixels. For blue pixel (2,4), the interpolated green intensity is the sum of green pixels (2,3), (2,5), (1,4), and (3,4), divided by four.
The red and blue values for a green pixel location can also be calculated from the 2 red and 2 blue pixels that surround each green pixel. For green pixel (2,3), the interpolated red value is the average of red pixels (1,3) and (3,3) above and below the green pixel, while the interpolated blue value is the average of blue pixels (2,2) and (2,4) to the right and left of the green pixel.
Many different techniques have been used for color interpolation and white balance. See U.S. Pat. Nos. 5,504,524 and 5,260,774, which show white-balance from analog signals. Sometimes a whole frame buffer is used for white balance or interpolation. Whole-frame buffers can be large, mega-pixel buffers that hold all 800×600 pixels. See, U.S. Pat. No. 5,260,774, FIGS. 1˜3. Color and edge enhancement are often not performed or are performed by a separate unit, perhaps also using a whole-frame buffer.
While such digital-camera processors are useful, cost reduction is desirable since digital cameras are price-sensitive consumer devices. Whole-frame buffers require large memories, and as digital cameras are increased in resolution, larger memories are needed for the larger number of pixels.
Parent Application Used 4-Line Buffer and Column Register—FIG. 3
The parent application disclosed a merged interpolator and edge detector that required only a 4-line buffer. FIG. 3 shows a multi-function image processor using a 4-line buffer and a column register of the parent application. Light captured by sensor front-end 22 is converted to electrical signals by a charge-coupled or transistor device, and the electrical signals are converted from analog to digital format. The image sensor does not generate all three primary color components (RGB) for each pixel, but only produces one of the three color components per pixel. The colors produced alternate from pixel to pixel, and from line to line in a Bayer pattern as shown in FIG. 2. Typically one pixel with only one of the three primary colors is output for each clock cycle.
The sensitivity of the sensor to the different primary colors is not equal. Some colors experience more attenuation than others. Also, the image may be under or over exposed. White balancer 26 multiplies each pixel from front end 22 by a gain. Red pixels are multiplied by a red gain, blue pixels by a blue gain, and green pixels by a green gain. The pixel-gain product is output from white balancer 26 to line buffer 30.
The pixel gains may be pre-set gains, or may be calculated on the fly. Pre-set gains can be calculated at the factory for the sensor type and fixed gains stored in a register and applied to white balancer 26. Video digital cameras produce a series of frames, and still cameras are normally pointed toward the picture before shooting, so gain calculator 24 can generate a running average of all pixels for each of the 3 colors from one frame, and use the averages to calculate gains for the next frame. Averages can also be generated for just a portion of an image frame, and the gains applied to the entire image or a portion of the image.
Four-line buffer 30 contains about four lines of pixels, rather than all 600 or more lines. For SVGA resolution, each line contains 800 pixels, so line buffer 30 contains 800×4 or 3,200 pixels. These are single-color pixels of 12 bits per color, so the memory size is 38 K bits. Other resolutions, such as 1024×768 have more pixels per line, so the size of line buffer 30 can increase to 48K bits or more.
Interpolator 41 performs both horizontal and vertical interpolation to generate all three color components (R,G,B) for each pixel. Interpolation is performed by adding weighted color values from neighboring pixels of the desired color. Only the neighboring pixels that touch the current pixel location are added in the interpolation. There are a total of 8 such neighboring pixels—three pixels on three lines.
The interpolation weighting or filter varies by color, since there are twice as many green pixels in a Bayer pattern as there are red or blue pixels. The green pixels form a checkerboard pattern with green pixels on every line, but the red or blue pixels form a more open pattern with pixels only on alternating lines.
The interpolation filter for green is:
                    1        /        8                            1        /        4                            1        /        8                                1        /        4                            1        /        2                            1        /        4                                1        /        8                            1        /        4                            1        /        8            which is a 3×3 kernel that can be separated into a 3×1 kernel and a 1×3 kernel:
      [                                        1            /            8                                                1            /            4                                                1            /            8                                                            1            /            4                                                1            /            2                                                1            /            4                                                            1            /            8                                                1            /            4                                                1            /            8                                ]    =            [                                                  1              /              4                                                                          1              /              2                                                                          1              /              4                                          ]        *          [                                                  1              /              2                                            1                                              1              /              2                                          ]      
The 3×1 kernel is implemented as a vertical interpolation step that multiplies the pixel above by ¼ and the pixel below by ¼, while the current pixel location is multiplied by ½. The 1×3 kernel becomes a horizontal interpolation step that multiplies the pixel on the left by ½ and the pixel to the right by ½, while the current pixel location is multiplied by 1. Since half of the locations in a Bayer pattern are missing green values, not all of the kernel coefficients are used to calculate a pixel's green value.
The interpolation filter for red and blue is:
                    1        /        4                            1        /        2                            1        /        4                                1        /        2                    1                      1        /        2                                1        /        4                            1        /        2                            1        /        4            which is a 3×3 kernel that can be separated into a 3×1 kernel and a 1×3 kernel:
      [                                        1            /            4                                                1            /            2                                                1            /            4                                                            1            /            2                                    1                                      1            /            2                                                            1            /            4                                                1            /            2                                                1            /            4                                ]    =            [                                                  1              /              2                                                            1                                                              1              /              2                                          ]        *          [                                                  1              /              2                                            1                                              1              /              2                                          ]      
The 3×1 kernel is implemented as a vertical interpolation step that multiplies the pixel above by ½ and the pixel below by ½, while the current pixel location is multiplied by 1. The 1×3 kernel becomes a horizontal interpolation step that multiplies the pixel on the left by ½ and the pixel to the right by ½, while the current pixel location is multiplied by 1. Since only one-quarter of the locations in a Bayer pattern contain red (blue) values, not all of the kernel coefficients are used to calculate a pixel's red (blue) value.
Horizontal adders 40 perform the horizontal interpolation for green, red, and blue for a current pixel location and some of the immediately surrounding pixel locations. The results are stored in column register 32. Column register 32 contains color components for just one column. Horizontal adders 40 calculate the green components for 5 lines of this column, while red and blue components are calculated for only 3 lines of this column. Thus column register 32 stores color components for a small region of the image.
These color components are not complete, since only the horizontal kernel has been applied to the pixels from line buffer 30. Vertical adders 50 perform the vertical interpolation from the horizontal results stored in column register 32, using the vertical kernels for green and red/blue. All three color components for a current pixel are generated by vertical adders 50, and this RGB value is stored in RGB register 34. The current pixel is a pixel in the third of the four lines from line buffer 30, and in the column from column register 32.
The green components for the line above and line below the current pixel are also generated by vertical adders 50. Thus the green components are generated for three lines of the column stored in column register 32. The green values are stored in green register 34′.
The RBG value for the currently-processed pixel from RGB register 34 is converted to YUV format by YUV converter 60. Color enhancer 38 receives the 2 chromatic values (U and V) and multiplies these values by a filter value to enhance certain colors. The enhanced U and V value for the current pixel is then output for display, storage, or compression.
The green values from green register 34′ are used for edge detection. The last set of green values for the previous 2 columns are stored in pipeline registers 64, so that a total of 9 green values are stored (three lines by three columns). An edge can be detected from the current (middle) pixel by comparison to the 8 surrounding pixels. When a difference above a threshold value is detected, and edge is signaled by edge detector 62. Edge enhancer 36 is then activated. Edge enhancer 36 receives the luminance (Y) value from YUV converter 60 for the current pixel, and simply outputs the Y value when no edge is detected. When edge detector 62 detects an edge, edge enhancer 36 multiplies the Y value by a filter to increase or decrease the brightness of the pixel, thereby enhancing or sharpening the edge.
The pipeline delay through pipeline registers 34′ and edge detector 62 matches the pipeline delay through RGB register 34 and YUV converter 60, so that the same current pixel is edge detected and YUV-converted. Thus edge detection and YUV conversion occur simultaneously for the same pixel. Horizontal adders 40 and vertical adders 50 interpolate for both RGB-YUV conversion and edge detection. Green values are calculated for two additional lines so that edge detection can also be performed using the intermediate results. Edge enhancement and color enhancement are also performed at the same time on the same pixel by color enhancer 38 and edge enhancer 36.
By performing a few additional calculations, interpolator 41 provides inputs to edge detector 62 as well as the current RGB value. Simultaneous edge detection is then possible using the same pipeline. Edge detection is performed on the green values rather than on the Y values so that edge detection can occur earlier in the pipeline.
While the merged device of the parent application is useful, steep cost reductions in digital cameras has made it desirable to further reduce the cost of the device. It is desired to use even smaller buffers in the color interpolator. A merged color interpolator that performs both edge detection and color interpolation is desired that uses less than a 4-line buffer.
It is desired to reduce cost further by eliminating the white balancer, the YUV converter, and pipeline registers in the parent device. It is further desired to eliminate the column registers and RGB buffers in the parent device.
What is desired is a digital-camera processor that does not use a whole-frame buffer. It is still desired to perform color interpolation of Bayer-pattern pixels without storing all the pixels in a frame. It is desired to use only a few smaller line buffers, which store only a few lines of pixels rather than all 600 lines in a SVGA image. It is further desired to perform both color interpolation and edge detection at the same time, using integrated hardware. It is desired to merge the horizontal/vertical edge detector into the interpolator. It is desired to also perform both horizontal and vertical edge enhancement without using a whole-frame buffer. It is desired to process all pixels in a frame in a single pass, without storing all the pixels.